/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sistcomptf;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;

/**
 *
 * @author Medina
 */
public class Comunicador {
    
    private static Comunicador instance = null;
    
    private int comPort; 
    private int status = -1;
    private Integer limitTempMax = 124;
    private Integer limitTempMin = 2;
    private Saver saver;
    private boolean coneccion;
    private Thread saverT;
    private Integer sendTemp;
    private boolean setACK = false;
    private int setTempACK = 140;
    private JLabel statusConeccion;
   
    
    
    private Comunicador(int comPort){
        this.comPort=comPort;
        saver = new Saver(this);
        System.out.println("Comunicador creado");
        
    }
    
    private synchronized static void createInstance(int comPort) {
        if (instance == null) { 
            instance = new Comunicador(comPort);
        }
    }

        public static Comunicador getInstance(int comPort) {
        if (instance == null) createInstance(comPort);
        return instance;
    }

    
    //en los apuntes los metodos naticos son publicos
    private native int initRS232C(int comPort);
    private native int get();
    private native int set(int send);
    private native int stop();
    
   static {
        System.loadLibrary("Comunicador");
    }
   
    public boolean initCom(JLabel statusConeccion){
        coneccion = false;
        this.statusConeccion = statusConeccion;
        //establesco la configuracion del puerto
        if(status ==(-1)){
            status = initRS232C(comPort);
            System.out.println("initrs232c: "+comPort+" status "+status);
            statusConeccion.setText("Inicio puerto: "+comPort+" estado: "+status);
            if(status < 0){
                System.out.println("ERROR CreateFile() INVALID_HANDLE_VALUE");
                statusConeccion.setText("ERROR CreateFile() INVALID_COM");
                status = -1;
                return coneccion;
            }             
            
        }
        System.out.println("initrs232c: "+comPort+" status "+status);
        
        //envio el ack de peticion de comunicacion y espero la respuesta        
        if(sendDato(setTempACK)!=0){
            System.out.println("Error de peticion de coneccion");
            statusConeccion.setText("Error de peticion de coneccion: 0x8c");
             return coneccion;
        }
        System.out.println("senddato232c to "+comPort+" :"+setTempACK);
        
        statusConeccion.setText("Enlace de comunicacion establecido");     
        
        if(getDato()== setTempACK){
            coneccion=true;
         
            saverT = new Thread(saver);
            saverT.start();
        }
        return coneccion;
    }
    public int sendDato(Integer sendTemp){
        int status = 1;
        this.sendTemp = sendTemp;
 //Chequear en q formato hay q enviar la temperatura hex o int       
    
        status = set(sendTemp.intValue());
        System.out.println("senddato232c: "+comPort+" "+sendTemp);
        
        return status;
    }
    public int getDato(){
        int recv=-1;
        
     
        recv = get();
        
        //System.out.println("recieving "+ recv);
        
       return recv;
    }
    public void stopCom(){
        
        if(coneccion){
        try {
            //Cierro el Pic. 0x8d
            System.out.println("Cerrando...."+ sendDato(141));
            statusConeccion.setText("Cerrando....");
            Thread.sleep(100);


            stop();
            
            saver.closeODBC();
        } catch (InterruptedException ex) {
            Logger.getLogger(Comunicador.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
    }
    //Este metodo fue creado en esta clase para evitar mezaclar la logica de negocio
    //con la logica de vista, y ademas no se le considero de una magnitud que requiera
    //levantarse con una clase propia
    public boolean validarTemp(Integer tempSet){
        boolean valida = false;
        
        if(tempSet.compareTo(limitTempMin)>=0 
           && tempSet.compareTo(limitTempMax)<=0){
            valida=true;
        }
        
        return valida;
    }
    
    public void informarError(int recv){
        if((recv & 127) == this.sendTemp){
            //La temp de seteo es confirmada
            System.out.println("Temperatura seteada " +recv);
            setACK =true;
        }
    }
    
    public boolean getSetTempState(){
        return setACK;
    }
}
